#include "Thermocouple.h"
#include <math.h>

// 滤波变量
static float filtered_temperature = 0.0f;
static float filtered_voltage = 0.0f;
static uint8_t filter_initialized = 0;

// K型热电偶电压到温度转换系数（多项式拟合）
// 基于NIST ITS-90标准
static const float k_type_voltage_to_temp_coeff[K_TYPE_COEFF_COUNT] = {
    0.0f,                    // a0
    25.08355f,               // a1
    0.07860106f,             // a2
    -0.2503131f,             // a3
    0.0831527f,              // a4
    -0.01228034f,            // a5
    0.0009804038f,           // a6
    -0.0000441303f,          // a7
    0.0000007062832f         // a8
};

// K型热电偶温度到电压转换系数（多项式拟合）
static const float k_type_temp_to_voltage_coeff[K_TYPE_TEMP_TO_VOLT_COEFF_COUNT] = {
    -0.176004136860E-01f,    // c0
    0.389212049750E-01f,     // c1
    0.185587700320E-01f,     // c2
    -0.994575928740E-02f,    // c3
    0.318409457190E-02f,     // c4
    -0.625045399490E-03f,    // c5
    0.791233891890E-04f,     // c6
    -0.637486305240E-05f,    // c7
    0.304802285640E-06f,     // c8
    -0.819127653590E-08f     // c9
};

/**
  * 函    数：K型热电偶电压转温度（简化算法）
  * 参    数：voltage_mv 热电偶电压（毫伏）
  * 返 回 值：温度（摄氏度）
  */
float Thermocouple_VoltageToTemperature(float voltage_mv)
{
    float temperature;
    
    // 使用简化的线性近似（适用于0-1000°C范围）
    // K型热电偶：约41μV/°C
    if (voltage_mv >= 0) {
        temperature = voltage_mv / 0.041f;
    } else {
        // 负温度范围使用不同的斜率
        temperature = voltage_mv / 0.039f;
    }
    
    return temperature;
}

/**
  * 函    数：K型热电偶温度转电压（简化算法）
  * 参    数：temperature_c 温度（摄氏度）
  * 返 回 值：热电偶电压（毫伏）
  */
float Thermocouple_TemperatureToVoltage(float temperature_c)
{
    float voltage_mv;
    
    // 使用简化的线性近似
    if (temperature_c >= 0) {
        voltage_mv = temperature_c * 0.041f;
    } else {
        voltage_mv = temperature_c * 0.039f;
    }
    
    return voltage_mv;
}

/**
  * 函    数：获取热电偶实际温度（包含冷端补偿）
  * 参    数：adc_voltage ADC读取的电压（伏特）
  * 参    数：cold_junction_temp 冷端温度（摄氏度）
  * 返 回 值：热电偶热端温度（摄氏度）
  */
float Thermocouple_GetTemperature(float adc_voltage, float cold_junction_temp)
{
    float thermocouple_voltage_mv;
    float cold_junction_voltage_mv;
    float compensated_voltage_mv;
    float hot_junction_temp;
    
    // 将ADC电压转换为毫伏
    thermocouple_voltage_mv = adc_voltage * 1000.0f;
    
    // 计算冷端补偿电压
    cold_junction_voltage_mv = Thermocouple_TemperatureToVoltage(cold_junction_temp);
    
    // 冷端补偿：热端电压 = 测量电压 + 冷端电压
    compensated_voltage_mv = thermocouple_voltage_mv + cold_junction_voltage_mv;
    
    // 将补偿后的电压转换为温度
    hot_junction_temp = Thermocouple_VoltageToTemperature(compensated_voltage_mv);
    
    return hot_junction_temp;
}

/**
  * 函    数：温度滤波（移动平均滤波）
  * 参    数：new_temp 新的温度值
  * 返 回 值：滤波后的温度值
  */
float Thermocouple_FilterTemperature(float new_temp)
{
    if (!filter_initialized) {
        filtered_temperature = new_temp;
        filter_initialized = 1;
        return new_temp;
    }
    
    // 移动平均滤波：filtered = α * new + (1-α) * old
    filtered_temperature = FILTER_ALPHA * new_temp + (1.0f - FILTER_ALPHA) * filtered_temperature;
    
    return filtered_temperature;
}

/**
  * 函    数：电压滤波（移动平均滤波）
  * 参    数：new_voltage 新的电压值
  * 返 回 值：滤波后的电压值
  */
float Thermocouple_FilterVoltage(float new_voltage)
{
    if (!filter_initialized) {
        filtered_voltage = new_voltage;
        return new_voltage;
    }
    
    // 移动平均滤波：filtered = α * new + (1-α) * old
    filtered_voltage = FILTER_ALPHA * new_voltage + (1.0f - FILTER_ALPHA) * filtered_voltage;
    
    return filtered_voltage;
}

/**
  * 函    数：重置滤波器
  * 参    数：无
  * 返 回 值：无
  */
void Thermocouple_ResetFilter(void)
{
    filtered_temperature = 0.0f;
    filtered_voltage = 0.0f;
    filter_initialized = 0;
}

/**
  * 函    数：热电偶模块初始化
  * 参    数：无
  * 返 回 值：无
  */
void Thermocouple_Init(void)
{
    // 初始化滤波变量
    Thermocouple_ResetFilter();
}
